#include<bits/stdc++.h>
using namespace std;

string str;
char graph[4505][4505];
bool visit[4505][4505];
const int way[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool succ=false;
int n,m,x,y;

int main(){
	while(cin>>n>>m){
		memset(graph,'#',sizeof(graph));
		for(int i=n;i>=1;i--){
			cin>>str;
			for(int j=1;j<=m;j++){
				if(str[j-1]!='#'){
					for(int u=0;u<3;u++){
						for(int v=0;v<3;v++){
							graph[j+u*m][i+v*n]=str[j-1];
						}
					}
					if(str[j-1]=='S'){
						x=m+j;y=n+i;
						graph[x][y]='.';
					}
				}
			};
		};
//		for(int i=3*n;i>0;i--){
//			for(int j=1;j<=3*m;j++){
//				cout<<graph[j][i];
//			}
//			cout<<endl;
//		}
		//BFS
		succ=false;
		memset(visit,false,sizeof(visit));
		queue<pair<int,int>> que;
		que.push(make_pair(x,y));
		while(!que.empty()&&!succ){
			x=que.front().first;
			y=que.front().second;
			//cout<<x<<' '<<y<<endl;
			que.pop();
			for(int i=0;i<4;i++){
				int x1=x+way[i][0],y1=y+way[i][1];
				if(x1<1||x1>3*m||y<1||y>3*n){
					continue;
				}
				if(!visit[x1][y1]&&graph[x1][y1]=='.'){
//					if(x1==1||x1==3*m||y==1||y==3*n){
//						cout<<"Yes"<<endl;
//						succ=true;
//						break;
//					}
					visit[x1][y1]=true;
					que.push(make_pair(x1,y1));
				}
				else if(graph[x1][y1]=='S'){
					cout<<"Yes"<<endl;
					succ=true;
					break;					
				}
			}
		}
		if(!succ){
			cout<<"No"<<endl;
		}
	}
	return 0;
}
